package arboles;

public class ArbolBinario {
	
	Nodo raiz;
	
	public ArbolBinario() {
	raiz=null;
	}

	public Nodo getRaiz() {
		return raiz;
	}

	public void setRaiz(Nodo raiz) {
		this.raiz = raiz;
	}
	
	//METODOS POSTORDEN	
	public String postorden() {//METODO PUBLICO
		
		return (postorden(this.raiz,"")+"\n");
	}
	private String postorden(Nodo n,String s){//METODO PRIVADO
		if (n != null){
			
		
		s = postorden(n.getHijoIzq(),s);
		s = postorden(n.getHijoDer(),s);
		s += " " + n.getDato();
		}
	return s;
	}
	
	
	//METODOS INORDEN	
		public String inorden() {//METODO PUBLICO
			
			return (inorden(this.raiz,"")+"\n");
		}
		
		private String inorden(Nodo n,String s){//METODO PRIVADO
			if (n != null){
				
			
			s = inorden(n.getHijoIzq(),s);
			s += " " + n.getDato();
			s = inorden(n.getHijoDer(),s);
			}
		return s;
		}
		
		
		//METODOS PREORDEN	
		public String preorden() {//METODO PUBLICO
			
			return (preorden(this.raiz,"")+"\n");
		}
		
		private String preorden(Nodo n,String s){//METODO PRIVADO
			if (n != null){
				
			s += " " + n.getDato();
			s = preorden(n.getHijoIzq(),s);
			s = preorden(n.getHijoDer(),s);
			}
		return s;
		}
		
		
	
		//BUSCAR
	public String buscar(int nro){
		if(buscar(this.raiz,nro))return "\nnumero "+nro+" Encontrado";
		return "\nnumero "+nro+" No encontrado";
	}
	
	private boolean buscar(Nodo n,int nro){
		if(n != null){
			if(n.getDato()==nro) return true;
			boolean ok1 = buscar(n.getHijoIzq(),nro);
			boolean ok2 = buscar(n.getHijoDer(),nro);
			if(ok1 || ok2 )return true;
		}
		return false;
	}
	
	
//contar los nodos de un arbol
	public String contar(){
		int cant=contar(this.raiz);
		return "\nEl arbol tiene "+cant+" nodos";
	}

private int contar(Nodo n) {
	if(n==null)	return 0;
	int c1 = contar(n.getHijoIzq());
	int c2 = contar(n.getHijoDer());
	int c3=c1 + c2 +1;
	return c3;
}


//SUMAR EL CONTENIDO DE LOS NODOS DEL ARBOL
public String sumar(){
		int sum=sumar(this.raiz);
		return "\nLa suma de todo el arbol es  "+sum;
	}

private int sumar(Nodo n) {
	if(n==null)	return 0;
	int c1 = sumar(n.getHijoIzq());
	int c2 = sumar(n.getHijoDer());
	int c3=c1 + c2 +n.getDato();
	return c3;
}

//CALCULAR ALTURA
public String calcularAltura() {
	int alt=calcularAltura(this.raiz);
	return "\nLa altura del arbol es "+alt;
}

private int calcularAltura(Nodo n) {
	if(n == null) return 0;
	int h1 = calcularAltura(n.getHijoIzq());
	int h2 = calcularAltura(n.getHijoDer());
	if (h1 > h2) return h1 + 1;
	return h2 + 1;
}

//BUSCAR EL NODO DE MAYOR VALOR
public String buscarMayor() {
	int may = buscarMayor(this.raiz); 
	return "\nEl mayor dato es "+may;
}

private int buscarMayor(Nodo n) {
	if(n==null)	return 0;
	int m1 = buscarMayor(n.getHijoIzq());
	int m2 = buscarMayor(n.getHijoDer());
	int m3 = n.getDato();
	
	if(m1 >= m2 && m1 >= m3)return m1;
	if(m2 >= m1 && m2 >= m3)return m2;
	return m3;
}
	
	

}
